登入认证拦截器,全局异常

一、登入认证拦截器

1.1、servlet—context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.1.xsd">
    <!-- 扫描com.mage.crm 下包 -->
    <context:component-scan base-package="com.mage.crm" />
    <!--定时任务配置-->
    <task:annotation-driven/>
    <bean id="freemarkerConfig"                     class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/WEB-INF/views/" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>
    <bean           class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="prefix" value="" />
        <property name="suffix" value=".ftl" />
        <property name="contentType" value="text/html;charset=UTF-8" />
    </bean>
    <!-- mvc 注解驱动 并添加json 支持 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <!-- 返回信息为字符串时 处理 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
            <!-- 将对象转换为json 对象 -->
            <bean                  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!-- 静态资源文件的处理放行 配置方式一 -->
     <mvc:default-servlet-handler />
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/index"/>
            <mvc:exclude-mapping path="/user/userLogin"/>
            <mvc:exclude-mapping path="/css/**"/>
            <mvc:exclude-mapping path="/jquery-easyui-1.3.3/**"/>
            <mvc:exclude-mapping path="/images/**"/>
            <mvc:exclude-mapping path="/js/**"/>
            <bean class="com.mage.crm.interceptors.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

1.2、流程图

在这里插入图片描述

1.3、编写LoginInterceptor

package com.mage.crm.interceptors;
import com.mage.crm.base.CrmConstant;
import com.mage.crm.service.UserService;
import com.mage.crm.util.AssertUtil;
import com.mage.crm.util.Base64Util;
import com.mage.crm.util.CookieUtil;
import com.mage.crm.vo.User;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor extends HandlerInterceptorAdapter{
    @Resource
    private UserService userService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String id=CookieUtil.getCookieValue(request,"id");
        AssertUtil.isTrue(StringUtils.isBlank(id),CrmConstant.LOGIN_NO_CODE, CrmConstant.LOGIN_NO_MSG);
        User user=userService.queryUserById(Base64Util.deCode(id));
        AssertUtil.isTrue(null==user,CrmConstant.LOGIN_NO_CODE,CrmConstant.LOGIN_NO_MSG);
        AssertUtil.isTrue("0".equals(user.getIsValid()),CrmConstant.LOGIN_NO_MSG);
        return true;
    }
}

二、定义全局异常

2.1、编写GlobalExceptionResolver

package com.mage.crm.base.exceptions;
import com.alibaba.fastjson.JSON;
import com.mage.crm.base.CrmConstant;
import com.mage.crm.model.MessageModel;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
 /**
  * 视图异常,return ModelAndView
  * json异常有ResponseBody return null; MessageModel httpServletResponse写出去
  * 1 是否是未登录异常
  * 2 json异常
  * 3 视图异常
  * @param httpServletRequest
  * @param httpServletResponse
  * @param handler
  * @param e
  * @return
  */
@Component
public class GlobalException implements HandlerExceptionResolver{
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) {
        ModelAndView modelAndView = createDefaultModelAndView(httpServletRequest);
        ParamException paramException;
        if(handler instanceof HandlerMethod){
            if (e instanceof ParamException){
                paramException = (ParamException) e;
                if(paramException.getCode()==CrmConstant.LOGIN_NO_CODE){//现在的异常是未登录的异常
                    modelAndView.addObject("code",paramException.getCode());
                    modelAndView.addObject("msg",paramException.getMsg());
                    return modelAndView;
                }
            }
//2 json异常
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            ResponseBody responseBody = method.getAnnotation(ResponseBody.class);
            if (null!=responseBody){//现在存在re json异常 返回messageModel
                MessageModel messageModel = new MessageModel();
                messageModel.setMsg(CrmConstant.OPS_FAILED_MSG);
                messageModel.setCode(CrmConstant.OPS_FAILED_CODE);
                if (e instanceof ParamException){
                    paramException= (ParamException) e;
                    messageModel.setCode(paramException.getCode());
                    messageModel.setMsg(paramException.getMsg());
                }
                httpServletResponse.setContentType("application/json;charset=uft-8");
                httpServletResponse.setCharacterEncoding("utf-8");
                PrintWriter printWriter = null;
                try {
                    printWriter = httpServletResponse.getWriter();

                } catch (IOException ioE) {
                    ioE.printStackTrace();
                }finally {
                    if(printWriter!=null){
                        printWriter.write(JSON.toJSONString(messageModel));
                        printWriter.flush();
                        printWriter.close();
                    }
                }
                return  null;
            }else {//3视图异常
                if (e instanceof ParamException){
                    paramException= (ParamException) e;
                    modelAndView.addObject("code",paramException.getCode());
                    modelAndView.addObject("msg",paramException.getMsg());
                    return modelAndView;
                }else {
                    return modelAndView;
                }
            }
        }
        return null;
    }
    public static ModelAndView createDefaultModelAndView(HttpServletRequest request) {
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.setViewName("error");
        modelAndView.addObject("code", CrmConstant.OPS_FAILED_CODE);
        modelAndView.addObject("msg",CrmConstant.OPS_FAILED_MSG);
        modelAndView.addObject("ctx",request.getContextPath());//为了防止拦截器没有放行,没有走controller,所以没有ctx
        modelAndView.addObject("uri",request.getRequestURI());
        return modelAndView;
    }
}

2.2、前台error

<#include "common.ftl" >
<script>
    $(function () {
        alert("${msg}")
        if("${uri}"=="/main"){
            window.location.href=ctx + "/index";
        }else{
            window.parent.location.href = ctx + "/index";
        }
    })
</script>

ert(" m s g " ) i f ( " {msg}") if(" msg")if("{uri}"=="/main"){
window.location.href=ctx + “/index”;
}else{
window.parent.location.href = ctx + “/index”;
}
})


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值