ssm框架后台对app的接口进行登录验证(拦截器,更智能只要方法上面有这个定义注解就验证)
2017-10-23 16:56
645 查看
1 pom依赖 我的spring版本是4.3.9 还有jackson版本2.8.8
2 spring-web.xml配置:
3 自己定义一个注解
4 自定义拦截器
最后在需要调用的接口上面加@LoginRequired注解就行。
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.8</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.8</version> </dependency>
2 spring-web.xml配置:
<!-- 拦截器 --> <mvc:interceptors> <!-- 多个拦截器,顺序执行 说明: 1 mvc:mapping 拦截器路径配置 ; 2 mvc:exclude-mapping 拦截器不需要拦截的路径--> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- <mvc:exclude-mapping path="/account/**" /> <mvc:exclude-mapping path="/message/**" /> <mvc:exclude-mapping path="/find/**" /> --> <bean class="com.datebook.aop.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
3 自己定义一个注解
package com.datebook.common; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by wangH on 2017/10/24. */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface LoginRequired { }
4 自定义拦截器
package com.datebook.aop; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.alibaba.fastjson.JSON; import com.datebook.common.JsonResult; import com.datebook.common.LoginRequired; import com.datebook.common.ResultCode; import com.datebook.service.WebTokenService; import com.datebook.vo.WebToken; /** * 登录认证的拦截器 */ @Configuration public class LoginInterceptor extends HandlerInterceptorAdapter{ @Autowired public WebTokenService tokenService; /** * Handler执行之前调用这个方法 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { final HttpServletRequest httpRequest = (HttpServletRequest) request; final HttpServletResponse httpResponse = (HttpServletResponse) response; final String authHeaderVal = httpRequest.getHeader("token"); if (!(handler instanceof HandlerMethod)) { return true; } String name = request.getServletPath().toString(); HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class); if (methodAnnotation != null) { if (StringUtils.isNotEmpty(authHeaderVal)) { try { WebToken webToken = tokenService.getToken(authHeaderVal); int userId = Integer.valueOf(webToken.getId()); System.out.println("========"+name+"===>LoginInterceptor preHandle 验证成功放行"); return true; } catch (Exception e) { response.setCharacterEncoding("UTF-8"); response.getWriter().write(JSON.toJSONString(new JsonResult(ResultCode.INVALID_AUTHCODE, "登录已过期,请重新登录!"))); System.out.println("========"+name+"===>LoginInterceptor preHandle 拦截,登录已过期,请重新登录!"); return false; } } else { response.setCharacterEncoding("UTF-8"); response.getWriter().write(JSON.toJSONString(new JsonResult(ResultCode.NOT_LOGIN,"尚未登录"))); System.out.println("========"+name+"===>LoginInterceptor preHandle 拦截,尚未登录!"); return false; } } System.out.println("========"+name+"===>LoginInterceptor preHandle 没加验证注解放行"); return true; } /** * Handler执行之后,ModelAndView返回之前调用这个方法 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { String name = request.getServletPath().toString(); System.out.println("========"+name+"===>LoginInterceptor postHandle"); } /** * Handler执行完成之后调用这个方法 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exc) throws Exception { String name = request.getServletPath().toString(); System.out.println("========"+name+"===>LoginInterceptor afterCompletion"); } }
最后在需要调用的接口上面加@LoginRequired注解就行。
/** * 通过手机号获取用户个人资料 * * */ @LoginRequired @RequestMapping(value = "/getByMobile", method = RequestMethod.POST) private JsonResult getByMobile(@RequestBody Map<String, Object> params) { if (params == null|| StringUtils.isEmpty(params.get("mobile").toString())) { return new JsonResult(ResultCode.PARAMS_ERROR, "参数错误"); } User user = userService.getUserByMobile(params.get("mobile").toString()); Map<String, Object> map = new HashMap<>(); user.setPassword("不告诉你"); map.put("userInfo", user); return new JsonResult(ResultCode.SUCCESS,"成功",map); }
相关文章推荐
- 通过自定义注解或拦截器实现APP调用后接口全局权限验证
- app与php后台接口登录认证、验证(seesion和token)
- springMVC拦截器进行登录验证
- struts2 在拦截器进行注入(依据Action是否实现自己定义接口)
- 整合redis缓存 代码生成器 SSM 后台框架 rest接口 shiro druid maven bootstrap html5
- Struts2中使用validate框架对Action的不同方法进行验证
- redis缓存 SSM 后台框架 rest接口 下拉多级联动
- 在SSM框架中我设置拦截器filter不能通过注解获取到实现类
- SSM 框架拦截器:实现用户验证
- ssm框架之登录验证
- springmvc跨域+token验证(app后台框架搭建二)
- java中,自定义注解拦截器来实现,在需要的拦截的方法上面加上一个注解@AccessRequired
- ThinkPhp3.2.3 多项目 后台 APP接口设计 框架设计
- 利用拦截器和自定义注解做登录以及权限验证
- Laravel框架实现修改登录和注册接口数据返回格式的方法
- SSM框架中使用Spring的@Transactional注解进行事务管理
- ThinkPhp3.2.3 多项目 后台 APP接口设计 框架设计
- CI框架全局登录验证控制方法
- 学习笔记: Struts2中使用validate框架对Action的不同方法进行验证