简单拦截器设置,作为初学者学习了解之用。为了做个演示例子方便,就没有连接数据库,后台用户名密码直接写死的。这个小例子之后我放到gitee上,方便大家有需要的学习使用。
public static final String USER_NAME = "admin";
public static final String PASS_WORD = "123456";
@Configuration
public class Config implements WebMvcConfigurer {
// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns 用来设置拦截路径,excludePathPatterns 用来设置放行路径
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/test/login2");
}
}
@Component
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("前置拦截");
HttpSession session = request.getSession();
//如果登陆过,session已经做过存储,在session有效时间内,可以验证通过
if (session.getAttribute("logUser") != null) {
System.out.println("验证通过");
return true;
} else {
//如果不登陆,直接访问接口,就会走到这个位置,返回信息没登陆,请先登陆
System.out.println("验证未通过");
JSONObject jsonObject = (JSONObject) JSON.toJSON(new Show("没登陆", 101));
returnJson(response,jsonObject);
return false;
}
}
private void returnJson(HttpServletResponse response, JSONObject result) throws Exception {
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=utf-8");
try {
writer = response.getWriter();
writer.print(result);
} catch (IOException e) {
} finally {
if (writer != null) {
writer.close();
}
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post 拦截");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
@RequestMapping(value = "/login2", method = RequestMethod.POST)
public Show login2(@RequestBody JSONObject jsonObject, HttpServletRequest httpServletRequest) {
String userName = (String) jsonObject.get("username");
String passWord = (String) jsonObject.get("password");
//只有用户名密码匹配上了才会进入条件,并记录session,否则返回登陆失败
if (USER_NAME.equals(userName) && PASS_WORD.equals(passWord)) {
httpServletRequest.getSession().setAttribute("logUser", userName);
Show show = new Show("登陆成功", 100);
return show;
} else {
Show show = new Show("登陆失败", -100);
return show;
}
}
//返回数据类型,封装到Show这个类中,包括状态码,描述,返回字段等
public class Show {
private String msg;
private Integer code;
private String result;
public Show(){
}
public Show(String msg, Integer code, String result) {
this.msg = msg;
this.code = code;
this.result = result;
}
public Show(String msg, Integer code) {
this.msg = msg;
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}