发表于: 2017-11-14 23:35:25
1 727
今天做的事情:
回过头来总结任务五,巩固一下。
场景是使用拦截器拦截未登录的用户进入需要验证登录的页面。
执行原理:
1、拦截请求的url;
2、从cookie中获取token;
3、如果没有token,则直接拦截,打回登录页面;
4、获取到token,调用sso(单点登录)系统的服务查询用户信息,返回session(用户信息);
5、对获取到的session进行处理。如果session已经过期,直接打回系统登录页面;如果session有效,则直 接放行,达到用户的请求页面
我是使用SSM框架来做任务五,而SpringMVC有两种实现拦截器的方式,一种是我已使用过得,使用HandlerInterceptor接口实现拦截器方法,而这次测试的是另一种实现方式WebRequestInterceptor、
/**
* Created by 有何不可 on 2017/11/14.
* void getKey(String strKey)从strKey的字条生成一个Key
* String getEncString(String strMing)对strMing进行加密,返回String密文
* String getDesString(String strMi)对strMin进行解密,返回String明文
* byte[] getEncCode(byte[] byteS)byte[]型的加密
* byte[] getDesCode(byte[] byteD)byte[]型的解密
*/
public class UserInterceptor3 implements WebRequestInterceptor {
@Autowired
private DesUtil desUtil;
@Autowired
private ServiceI serviceI;
private String paskey="87654321";
public void preHandle(WebRequest webRequest) throws Exception {
String status ="";
//从cookie中拿到token令牌 里面有用户的id和登录时间
String token = ServletCookie.getCookie((HttpServletRequest) webRequest, "token");
//判断非空
if(token!=null){
//把token进行解密
desUtil.setKey(paskey);
desUtil.setEncString(token);
String strM = desUtil.getStrM();
String[] split = strM.split(",");
User u = new User();
u.setId(split[0]);
u.setCreate_date(Long.parseLong(split[1]));
User byToken = serviceI.findByToken(u);
if(byToken!=null){
return;
}
}else {
return;
}
}
public void postHandle(WebRequest webRequest, ModelMap modelMap) throws Exception {
}
public void afterCompletion(WebRequest webRequest, Exception e) throws Exception {
}
}
代码写到末尾,不知道怎么写下去了。
WebRequestInterceptor接口和HandleInterceptor接口一样定义了三个方法,preHandle 在处理请求之前调用 ,postHandle 是在请求处理之后,视图渲染前调用,afterCompletion是在视图渲染之后调用。
1.方法参数不同。WebRequest是Spring定义的接口,它是对HttpServletRequest的封装。对WebRequest 进行的操作都将同步到HttpServletRequest 中。WebRequest 的set/getAttribute(name, value, scope)比HttpServletRequest 的set/getAttribute多了一个scope参数。它有三个取值:
SCOPE_REQUEST:它的值是0,表示request请求作用范围。
SCOPE_SESSION :它的值是1,表示session请求作用范围。
SCOPE_GLOBAL_SESSION :它的值是2 ,表示全局会话作用范围,即ServletContext上下文作用范围。
2.preHandle 方法。WebRequestInterceptor的该方法返回值为void,不是boolean。所以该方法不能用于请求阻断,一般用于资源准备。
3.postHandle 方法。preHandle 中准备的数据都可以通过参数WebRequest访问。ModelMap 是Controller 处理之后返回的Model 对象,可以通过改变它的属性来改变Model 对象模型,达到改变视图渲染效果的目的。
4.afterCompletion方法。Exception 参数表示的是当前请求的异常对象,如果Controller 抛出的异常已经被处理过,则Exception对象为null 。
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
拦截器与过滤器的区别 :
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
而之前的三种拦截器实现方式,是针对struts来实现的。所以先不去深究了。
关于cookie和session。如果禁用了cookie,想要再使用session,经常用一种URL重写,就是把session id直接附加到URL路径的后面。当程序需要为客户端的请求创建一个session时,服务器首先检查这个请求里面是否包含了session标识(就是session id)。如果没有的,会给客户端创建一个session并且生成一个与此session相关的session id。除了url重写,还有一个是表单隐藏字段,就是服务器会自动修改表单,添加一个隐藏字段,以便提交表单时能够把sessionid传递到服务器、
<form name=”"testform”" action=”"/xxx”"> <input type=”"hidden”" name=”"jsessionid”" value=”"ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764″”> <input type=”"text”"> </form>
URL重写:http://www.test.com/test;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
再来了解一下任务6,1.下载JMeter,压测自己的JSP,查看TPS数据,调整并发数,压到程序挂掉为止。
JMeter :Apache jmeter 是一个100%的纯java桌面应用,用于压力测试和性能测量。Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器,网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。
TPS:一般指事务管理系统,Transaction processing systems (TPS),是在数据发生处将它们记录下来,通过OLTP产生新的信息,将信息保存在数据库中供其他信息系统使用,提高事务效率并且保证其正确性。
最后做个一个退出,省事一点没有加JS,其实退出应该是有一个提示,确认退出吗,时间关系就不多整了。下面是代码
//清除cookie 实现退出功能
@RequestMapping("/gout")
public String gout(HttpServletRequest request,HttpServletResponse response){
Cookie[] cookies = request.getCookies();
for (Cookie c:cookies
) {
if(c!=null){
c.setMaxAge(0);
c.setPath("/");
response.addCookie(c);
}
}
return "redirect:list";
}
也可以直接返回登录页面,没大问题。
遇到的问题:
暂无。
收获:
将任务5圆满完成,熟练使用cookie验证登录状态,了解sessio与cookie的应用,会使用MD5,DES工具类进行加密操作,还有一点任务6需要的知识点,明天开始新的任务。
评论