简单的实现登录拦截及统一异常处理(自定义异常)

webmvc配置类:

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
        .addPathPatterns("/**")
        .excludePathPatterns("/user/login");
    }
}

注:registry.addInterceptor(拦截器类对象).addPathPatterns("需要拦截的请求路径").excludePathPatterns("可以放行的请求路径");

拦截器类,这里为登录拦截

public class LoginInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest hServletRequest, HttpServletResponse hServletResponse, Object object) throws Exception {
        // 案例采用session存储登录用户,所以从session获取登录用户     HttpSession session = hServletRequest.getSession();
        TUser tUser=(TUser)session.getAttribute("user");        // 判断session里是否能取出用户
        if(tUser==null) {
            returnErrorMessage(hServletResponse, "当前操作需要先进行用户登录");
            return false;
        }
        return true;
    }

    private void returnErrorMessage(HttpServletResponse response, String errorMessage) throws IOException {
        response.setCharacterEncoding("utf-8");
        Map<String, Object> var=new HashMap<>();
        var.put("success", false);
        var.put("errorMessage", errorMessage);
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        ObjectMapper mapper = new ObjectMapper();
        String jsonOfRST =mapper.writeValueAsString(var);
        out.print(jsonOfRST);
        out.flush();
    }
}

到这里实现了简单的登录拦截,但是上面通过response对象获取的输出流来写入错误信息,下面采用自定义异常来处理

异常类

public class UnloggedException extends RuntimeException{
    private static final long serialVersionUID = 181074719716690931L;

    public UnloggedException() {
        super("当前操作需要先进行登录");
    }
}

修改拦截器类的preHandle方法,于是returnErrorMessage方法可以去掉了

@Override
    public boolean preHandle(HttpServletRequest hServletRequest, HttpServletResponse hServletResponse, Object object) throws Exception {
        HttpSession session = hServletRequest.getSession();
        TUser tUser=(TUser)session.getAttribute("user");
        if(tUser==null) {
            throw new UnloggedException();
        }
        return true;
    }

最后配置异常处理类

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
    @ExceptionHandler
    public JSONObject handleException(Exception e) {
        return ActionHelper.responseFailed(e.getMessage());
    }
}

上面的返回值及ActionHelper为我使用的返回工具类,依赖为com.alibaba的fastjson,版本参考1.2.49。

可以根据实际情况修改返回方式及返回值。

此后所有的异常,都可以通过自定义异常的方式,交由异常处理类来进行处理,返回结果。

原文地址:https://www.cnblogs.com/it-taosir/p/9716028.html

时间: 2024-08-29 15:30:13

简单的实现登录拦截及统一异常处理(自定义异常)的相关文章

ASP.NET MVC如何做一个简单的非法登录拦截

摘要:做网站的时候,经常碰到这种问题,一个没登录的用户,却可以通过localhost:23244/Main/Index的方式进入到网站的内部,查看网站的信息.我们知道,这是极不安全的,那么如何对这样的操作进行拦截呢,这里记录我学到的一个小小方法. 以下是我要记录的正文部分: 开始讲之前声明一点,我目前的能力着实很有限,有些东西并不很懂,也可能讲不清楚,有些知识表述可能是错误的(尽量避免),主要是把我对这部分做法的理解记载下来,以后自己独立开发的时候确保不会忘记. 非法登录拦截,主要用到的是.ne

SpringMVC统一异常处理简单配置

第一步:自定义异常处理类实现HandlerExceptionResolver接口 import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView

vue+axios 前端实现登录拦截

参考:http://blog.csdn.net/qq673318522/article/details/55506650 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面. const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: 'r

登录拦截逻辑

登录拦截逻辑 转自http://blog.csdn.net/qq673318522/article/details/55506650 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面. const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: 're

springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解.请求乱码解决.统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制.登录判断重定向.session时间设置 springboot + shiro 动态更新用户信息 基于前篇,新增功能: 新增shiro权限注解: 请求乱码问题解决: 统一异常处理. 源码已集成到项目中: github源码: https://githu

【转】vue+axios 前端实现登录拦截(路由拦截、http拦截)

一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const routes = [     {         path: '/',         name: '/',         component: Index     },

vue+axios 前端实现登录拦截(路由拦截、http拦截)

一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录页面. const routes = [     {         path: '/',         name: '/',         component: Index     },     {         path: '/repository',         name: 'rep

Spring Boot2从入门到实战:统一异常处理

都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效向前.如前后端交互协议,如本文探讨的异常处理. 1. Spring Mvc中的异常处理 在spring mvc中,跟异常处理的相关类大致如下 上图中,spring mvc中处理异常的类(包括在请求映射时与请求处理过程中抛出的异常),都是 HandlerExceptionResolver 接口的实现,

Web API系列(三)统一异常处理

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前面讲了webapi的安全验证和参数安全,不清楚的朋友,可以看看前面的文章,<Web API系列(二)接口安全和参数校验>,本文主要介绍Web API异常结果的处理.作为内部或者是对外提供的统一webapi 接口,统一的异常处理,把正确的信息