新浪新闻客户端

Javaweb之Filter案例练习-自动登录问题和MD5加密

Javaweb之Filter案例练习-自动登录问题和MD5加密
2019年08月17日 09:18 新浪网 作者 凯哥Java

  自动登录问题和MD5加密

  前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截。这肯定不合适。我们本来访问/login.jsp,本来就是去登录,结果也进行了拦截。

  解决自动登录问题

  其实,我们可以在AutoLoginFilter.java这个文件中写if语句来判断,虽然web.xml文件还是配置拦截/*, 但是只有在if满足条件,才进行拦截,否则,直接放行就好。

  下面if条件,我们不希望/login.jsp 和/loginServlet这两个请求地址被拦截,所以这里取反,使用!符号。意思就是除了这两个之外地址都拦截。

  packagecom.kaigejava.web.filter;

  importjava.io.IOException;

  importjavax.servlet.Filter;

  importjavax.servlet.FilterChain;

  importjavax.servlet.FilterConfig;

  importjavax.servlet.ServletException;

  importjavax.servlet.ServletRequest;

  importjavax.servlet.ServletResponse;

  importjavax.servlet.http.Cookie;

  importjavax.servlet.http.HttpServletRequest;

  importjavax.servlet.http.HttpServletResponse;

  importcom.anthony.domain.User;

  importcom.anthony.service.UserService;

  importcom.anthony.service.UserServiceImpl;

  publicclassAutoLoginFilterimplementsFilter {

  publicvoiddestroy() {

  }

  publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)

  throwsIOException, ServletException {

  // 1转换两个对象HttpServletRequest HttpServletResponse

  HttpServletRequestreq= (HttpServletRequest)request;

  HttpServletResponseresp= (HttpServletResponse)response;

  //优化

  Stringuri=req.getRequestURI();//浏览器中url端口8080后面部分

  Stringpath=req.getContextPath();//应用名称

  path=uri.substring(path.length());// /login.jsp

  if(!("/login.jsp".equals(path)) || ("/loginServlet".equals(path))) {

  // 2.处理业务,这里是得到cookies

  //优化

  Useruser= (User)req.getSession().getAttribute("user");

  if(user==null) {//说明从来没有登录过

  Cookie[]cookies=req.getCookies();

  Stringusername="";

  Stringpassword="";

  for(inti= 0;cookies!=null&&icookies.length;i++) {

  if("user".equals(cookies[i].getName())) {

  Stringvalue=cookies[i].getValue();//username&password这样一个格式字符串

  //得到用户名和密码

  String[]values=value.split("&");

  username=values[0];

  password=values[1];

  }

  }

  UserServiceus=newUserServiceImpl();

  Useru=us.findUser(username,password);

  if(u!=null) {//如果登录成功,把用户信息存到session中

  req.getSession().setAttribute("user",u);

  }

  }

  }

  // 3.放行

  chain.doFilter(request,response);

  }

  publicvoidinit(FilterConfigfConfig)throwsServletException {

  }

  }

  可以再次测试下,例如在LoginServlet中或者打印用户名和密码字段,可以发现只执行了一次登录,也就是没有被拦截。

  MD5加密

  第一个要知道的是MD5(Message-Digest Algoorithm 5)是一种不可逆的加密算法。也就是只能加密,不能解密操作。那么我们登录是如何做到呢,一般来说数据库中用户名密码肯定采用MD5加密。在后台拿到前端获取密码,然后把这个密码通过MD5加密,然后传入数据库和密码这栏比较,相等就说明密码一样。

  先来看看MD5加密效果

  Javaweb之Filter案例练习-自动登录问题和MD5加密

  上面这个图是用户密码在数据库中是没有加密过的,下面我们执行把第二个用户进行md5加密之后,看看加密之后密码处的效果。

  UPDATE users SET PASSWORD=MD5(PASSWORD) WHERE id=2;

  Javaweb之Filter案例练习-自动登录问题和MD5加密

  这个一长串密码就是MD5加密之后的效果。

  Java中如何使用MD5加密

  这个MD5加密方法算一个工具类吧,网上很容易搜到,下面是代码方法

  packagecom.kaigejava.util;

  importjava.math.BigInteger;

  importjava.security.MessageDigest;

  importjava.security.NoSuchAlgorithmException;

  publicclassMD5Utils {

  publicstaticString md5(StringplainText) {

  byte[]secreBytes=null;

  try{

  secreBytes= MessageDigest.getInstance("md5").digest(plainText.getBytes());

  }catch(NoSuchAlgorithmExceptione) {

  thrownewRuntimeException("没有md5这个算法!");

  }

  Stringmd5code=newBigInteger(1,secreBytes).toString(16);

  for(inti= 0;imd5code.length();i++) {

  md5code="0"+md5code;

  }

  returnmd5code;

  }

  }

  登录过程使用加密密码

  在LoginServlet.java中处理登录,这个我们通过request.getParameter(“password”)得到的密码肯定是明文的,这时候我们需要先给password进行MD5加密,然后进行登录操作。(前提是用户注册过程中,后台代码在处理注册的servlet中就把用户密码给进行MD5加密,然后保存在数据中的密码就是加密的形式)

  Javaweb之Filter案例练习-自动登录问题和MD5加密

  上面如果是在注册的servlet中也这样对password进行加密。

特别声明:以上文章内容仅代表作者本人观点,不代表新浪网观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与新浪网联系。
权利保护声明页/Notice to Right Holders

举报邮箱:jubao@vip.sina.com

Copyright © 1996-2024 SINA Corporation

All Rights Reserved 新浪公司 版权所有