[Java]利用拦截器和自定义注解做登录以及权限验证
1.自定义注解
需要验证登录的注解
package com.etaofinance.wap.common; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)//
@Target({ElementType.METHOD, ElementType.TYPE})//该注解修饰类中的方法
@Inherited
public @interface RequireLogin{
/**
* 登录验证注解
* 该注解可以标记Controller 或 Controller 中的方法.
* 如果Controller 有该标记,那么这个Controller下面所有的方法都会被过滤器
* 进行验证
* 如果Controller 没有有该标记,但Controller中的某个方法拥有该标记
* 那么这个方法将被过滤器验证(其他没有被标记的不会被验证)
*
* 特别注意,如果一个Controller 被标记RequireLogin 需要验证
* 但是其中某些方法不想被验证.请参见NoRequireLogin标记
*
* 茹化肖 2016年3月30日10:51:13
*/
}
不需要验证登录的注解
package com.etaofinance.wap.common; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Retention(RetentionPolicy.RUNTIME)//
@Target(ElementType.METHOD)//该注解修饰类中的方法
@Inherited
public @interface NoRequireLogin{
/**
* 不需要登录验证的方法注解注解
* 该注解在Controller 标记了 RequireLogin 特性时
* 某个方法不需要验证登录,那么为该方法标记该注解
* 茹化肖 2016年3月30日10:47:16
*/
}
拦截器实现
package com.etaofinance.wap.common; import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.etaofinance.core.util.JsonUtil;
import com.etaofinance.core.util.PropertyUtils;
import com.etaofinance.entity.common.HttpResultModel;
/**
* 权限拦截器
* @author ofmyi_000
*
*/
public class AuthInteceptor extends HandlerInterceptorAdapter { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String basePath =PropertyUtils.getProperty("java.wap.url");
if (handler instanceof HandlerMethod) {
HandlerMethod myHandlerMethod = (HandlerMethod) handler;
Object bean = myHandlerMethod.getBean();
Method method= myHandlerMethod.getMethod();
Annotation classAnnotation = bean.getClass().getAnnotation(RequireLogin.class);//类上有该标记
Annotation methodAnnotation=method.getAnnotation(RequireLogin.class);//方法上有该标记
Annotation methodNologinAnnotation=method.getAnnotation(NoRequireLogin.class);//
if((classAnnotation!=null&&methodNologinAnnotation==null)
||(classAnnotation==null&&methodAnnotation!=null))
{
boolean isLogin = LoginUtil.checkIsLogin(request,response);
if(isLogin)
return true;
else{//未登录
if(isAjax(request)){
//Ajax请求返回JSON
HttpResultModel<Object> rep=new HttpResultModel<Object>();
rep.setCode(-1);
rep.setMsg("请登录后操作!");
String data = JsonUtil.obj2string(rep);
response.setHeader("content-type", "text/html;charset=UTF-8");
OutputStream out = response.getOutputStream();
out.write(data.getBytes("UTF-8"));
return false;
}
response.sendRedirect(basePath); }//IF LOGIN END
}//if Annotation end
}
return true;
}
private boolean isAjax(HttpServletRequest request){
String requestType = request.getHeader("X-Requested-With");
if (requestType != null && requestType.equals("XMLHttpRequest")) {
return true;
}
return false;
}
}
XML拦截器配置
...............
<mvc:interceptors>
<bean class="com.etaofinance.wap.common.GlobalLogInteceptor">
<property name="sourceSys" value="etaofinancewap"></property>
</bean>
<bean class="com.etaofinance.wap.common.AuthInteceptor" />
</mvc:interceptors>
.................
[Java]利用拦截器和自定义注解做登录以及权限验证的更多相关文章
- JavaEE权限管理系统的搭建(六)--------使用拦截器实现菜单URL的跳转权限验证和页面的三级菜单权限按钮显示
本小结讲解,点击菜单进行页面跳转,看下图,点击管理员列表后会被认证拦截器首先拦截,验证用户是否登录,如果登录就放行,紧接着会被权限验证拦截器再次拦截,拦截的时候,会根据URL地址上找到对应的方法,然后 ...
- SpringMVC拦截器+Spring自定义注解实现权限验证
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 拦截器和自定义注解@interface
1 .拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在Handler执行之前或之后加入某些操作,其实就是AOP的一种实现策略. 拦截用户的请求并进行相应的处理,比如:判断用 ...
- Spring MVC基础知识整理➣拦截器和自定义注解
概述 Spring MVC中通过注解来对方法或者类进行动态的说明或者标注,类似于配置标识文件的属性信息.当标注的类或者方式被使用时候,通过提取注解信息来达到对类的动态处理.在 MVC中,我们常用的注解 ...
- struts2拦截器加自定义注解实现权限控制
https://blog.csdn.net/paul342/article/details/51436565 今天结合Java的Annotation和Struts2进行注解拦截器权限控制. 功能需求: ...
- SpringBoot 拦截器和自定义注解判断请求是否合法
应用场景举例: 当不同身份的用户请求一个接口时,用来校验用户某些身份,这样可以对单个字段数据进行精确权限控制,具体看代码注释 自定义注解 /** * 对比请求的用户身份是否符合 * @author l ...
- 基于springboot通过自定义注解和AOP实现权限验证
一.移入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...
- Mybatis利用拦截器做统一分页
mybatis利用拦截器做统一分页 查询传递Page参数,或者传递继承Page的对象参数.拦截器查询记录之后,通过改造查询sql获取总记录数.赋值Page对象,返回. 示例项目:https://git ...
- java之拦截器Interceptor
1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...
随机推荐
- seajs进行模块化开发
seajs进行模块化开发 模块化前端开发入门指南(二) 2015-08-26 15:23 by paseo, 370 阅读, 0 评论, 收藏, 编辑 概览 使用seajs模块化加载器进行模块化开发, ...
- SQL Mirroring[Hot back up with Double machine]
Background: It's fairly common for businesses to want to provide some high availability for their SQ ...
- 公交部署wifi热点,是否有必要?
小城市.大城市,公交车永远匆匆路过的风景,他带我们到四方.马上.一些公交车也已覆盖免费wifi,只有在我看来,,路上wifi似乎没有太大用处.何出此言? 相比而言.在长途车.飞机.火车上构建wifi热 ...
- JVM可支持的最大线程数(转)
摘自:http://sesame.iteye.com/blog/622670 工作中碰到过这个问题好几次了,觉得有必要总结一下,所以有了这篇文章,这篇文章分为三个部分:认识问题.分析问题.解决问题. ...
- ACM算法
一.数论算法 1.求两数的最大公约数 2.求两数的最小公倍数 3.素数的求法 A.小范围内判断一个数是否为质数: B.判断longint范围内的数是否为素数(包含求50000以内的素数表): 二. ...
- [全国首发]Swift视频教程
我真的很抱歉,每个人,从7带班开始到现在,最后的成品带. 到了最新的版本号,Swift语言一直在更新,非常多写法都变了.大家能够加我私人微信:wanghj29,我会在朋友圈更新swift的最新动态.此 ...
- javascript 中的location.pathname
1 location.pathname; 这在之前我没怎么注意过,所以研究研究.location.pathname:返回URL的域名(域名IP)后的部分.例如 http://www.joymood.c ...
- HDU 2616 Kill the monster (暴力搜索 || 终极全阵列暴力)
主题链接:HDU 2616 Kill the monster 意甲冠军:有N技能比赛HP有M怪物,技能(A,M),能伤害为A.当怪兽HP<=M时伤害为2*A. 求打死怪兽(HP<=0)用的 ...
- HDU 4303 Hourai Jeweled 树dp 所有权利和航点 dfs2次要
意甲冠军: long long ans = 0; for(int i = 1; i <= n; i++) for(int j = i+1; j <= n; j++) ans += F(i, ...
- C#操作Xml:使用XmlWriter写Xml
假定创建了XmlWriter的实例变量xmlWriter,下文中将使用此实例变量写Xml 1.如何使用XmlWriter写Xml文档声明 ? // WriteStartDocument方法可以接受一个 ...