一、登入认证拦截器
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”;
}
})