置信人人在各大网站都邑碰到,登录时,在登录框涌现下次免上岸/一个月免上岸的相似选项,本文就是解说怎样完成,在这纪录一下,也算是做个备忘录合集,假如文中有错,迎接人人指出
为啥说自上岸一次呢,由于当接见某个页面时,假如第一次自动登录失利时,你下次革新接见时还再次走自动登录流程,就会涌现死循环。
本文代码示例框架为Spring MVC,下面就解说完成该功用的须要掌握哪些学问:cookies与过滤器
1.cookies
作甚Cookies:Cookies为 Web 运用程序保留用户相干信息供应了一种有效的要领。比方,当用户接见您的站点时,您能够运用 Cookie 保留用户首选项或其他信息,如许,当用户下次再接见您的站点时,运用程序就能够检索之前保留的信息。
我们看一下是怎样保留cookies和怎样删除cookies
保留cookies
String newUserName = null; try { newUserName = URLEncoder.encode(username, "UTF-8");//把用户名转码,防备用户名是中文,cookies保留中文掏出会乱码 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } Cookie nameCookie = new Cookie("username", newUserName); String pwdMd5Cook = MD5Util.MD5(Pwd); Cookie pwdCookie = new Cookie("pwd", pwdMd5Cook);// 保留加密后的暗码 nameCookie.setMaxAge(60 * 60 * 24 * 365);// 用户名保留一年 pwdCookie.setMaxAge(60 * 60 * 24 * 30);// 暗码保留30天 // 发送Cookie信息到浏览器 response.addCookie(nameCookie); response.addCookie(pwdCookie);
删除cookies,删除很简单,但值得注意的时,删除cookies,跟保留cookies一定要在同一个掌握层,不然会找不到保留的cookies,致使删除不了
Cookie cookie = new Cookie("pwd", null); cookie.setMaxAge(0);// 删除暗码cookie response.addCookie(cookie);
2.Filter-过滤器
Filter也称之为过滤器,它是Servlet手艺中最有用的手艺,Web开发人员经由过程Filter手艺,对web服务器治理的一切web资本:比方Jsp, Servlet, 静态图片文件或静态 html 文件等举行阻拦,从而完成一些特别的功用。比方完成URL级别的权限接见掌握、过滤敏感辞汇、紧缩相应信息等一些高等功用。
完成要领:继续Filter接口,并完成其doFilter要领。在web.xml文件中对编写的filter类举行注册,并设置它所能阻拦的资本
<filter>指定一个过滤器。 <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。 <filter-class>元素用于指定过滤器的完全的限制类名。 <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。 在过滤器中,能够运用FilterConfig接口对象来接见初始化参数。 <filter-mapping>元素用于设置一个 Filter 所担任阻拦的资本。一个Filter阻拦的资本可经由过程两种体式格局来指定:Servlet 称号和资本接见的要求途径 <filter-name>子元素用于设置filter的注册称号。该值必需是在<filter>元素中声明过的过滤器的名字 <url-pattern>设置 filter 所阻拦的要求途径(过滤器关联的URL款式) <servlet-name>指定过滤器所阻拦的Servlet称号。 <filter> <filter-name>suicaiFilter</filter-name> <filter-class>com.suicai.filter.suicaiFilter</filter-class> </filter> <filter-mapping> <filter-name>suicaiFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
下面看一下现实运用代码:
public class suicaiFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; HttpSession session = req.getSession(); String requestURI = req.getRequestURI(); String param = req.getQueryString(); String url = req.getServletPath(); if(param!=null){ url = url+"?"+param; } if(requestURI.contains("js") || requestURI.contains("css") || requestURI.contains("images")){ //不过滤css,js,images等静态资本 chain.doFilter(request, response); }else if(requestURI.contains("/info/")||requestURI.contains("/gys/")){ //过滤前台接见页面,跟前台个人中间(供应商背景),自动登录一次,登录不胜利不举行操纵,个人中间登录不胜利,则跳到登录页面 ProviderInfo providerInfo = (ProviderInfo) session.getAttribute("providerInfo_gys"); String IsAutomaticLogin = (String) session.getAttribute("IsAutomaticLogin");//是不是已走过自动登录流程标识 if(requestURI.contains("/info/") && !requestURI.contains("/login")){ //接见流派等不须要必需登录的(登录除外),只尝试登录一次,假如不胜利,不举行操纵 if(providerInfo==null && IsAutomaticLogin == null){ req.getSession().setAttribute("goURL", url); res.sendRedirect(req.getContextPath() + "/common/automaticLogin"); }else if(providerInfo==null && IsAutomaticLogin != null ){ chain.doFilter(request, response); }else{ chain.doFilter(request, response); } }else if(requestURI.contains("/gys/")){//接见个人中间,自上岸一次,不胜利跳转到登录页面 if(providerInfo==null && IsAutomaticLogin == null){ req.getSession().setAttribute("goURL", url); res.sendRedirect(req.getContextPath() + "/common/automaticLogin"); }else if(providerInfo==null && IsAutomaticLogin != null ){ session.setAttribute("redirectUrl", url); res.sendRedirect(req.getContextPath() + "/login.jsp?redirectUrl="+url); }else{ chain.doFilter(request, response); } }else{ chain.doFilter(request, response); } }else{ //不过滤 chain.doFilter(request, response); } } @Override public void init(FilterConfig arg0) throws ServletException { } }
从代码中可知,须要一个是不是已自动登录过的标识(IsAutomaticLogin),该标识是在走自动登录时(不论成不胜利)保留起来的
3.连系上面供应学问,下面为团体代码展现,如发明不对处所,迎接人人指出
@Controller @RequestMapping("/common") public class CommonController{ /** * 自动登录要领 * @param request * @param response * @param username * @param pwd * @param ProviderInfo 供应商账户信息model * @return */ @RequestMapping("/automaticLogin") public String automaticLogin(HttpServletRequest request,ServletResponse response,@CookieValue(value = "username", required = false) String username,@CookieValue(value = "pwd", required = false) String pwd,ProviderInfo ProviderInfo) { // 保留需求登录前的链接 String goURL = (String) session.getAttribute("goURL"); if (username == null) {//cookies中没有效户名,一定不须要自动登录 session.setAttribute("IsAutomaticLogin", "0"); return "redirect:" + goURL; } else { try { username = URLDecoder.decode(username, "UTF-8");//转义,防备中文 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } // cookie失效 session一定为空,由于登录时,一定会把用户名保留在cookie中 if ("".equals(username) || username == null) {// 运用session登录不了,不举行任何操纵,不在进入这个要领 session.setAttribute("IsAutomaticLogin", "0"); return "redirect:" + goURL; } else { // cookie中没有暗码,推断session为不为空,假如为空,申明没有登录,假如不为空,申明,用户是挑选不记着暗码登录(所以cookie中没有暗码) if ("".equals(pwd) || pwd == null) { ProviderInfo customer1 = (ProviderInfo) session.getAttribute("providerInfo_gys"); if (customer1 == null) {// 运用session登录不了,不举行任何操纵,不在进入这个要领 session.setAttribute("IsAutomaticLogin", "0"); return "redirect:" + goURL; } else { // 已登录,不再进入这个要领 return "redirect:" + goURL; } } else { // cookie中有暗码,推断session为不为空,假如为空,申明没有登录,假如不为空,申明已登录 ProviderInfo customer1 = (ProviderInfo) session.getAttribute("providerInfo_gys"); if (customer1 == null) {// 当前没有登录,挪用cookies中的用户名跟暗码举行登录 // 举行自动登录操纵,登录胜利后返回本来页面 ProviderInfo customer3 = ValidateDate(username); customer3.setPwd(pwd); customer3.setAccountType(6); ProviderInfo customer2 = infoService.login(customer3);//挪用登录要领 if (customer2 == null) {// 自动登录失利,不再进入这个要领 session.setAttribute("IsAutomaticLogin", "0"); return "redirect:" + goURL; } else { // 上岸胜利保留客户信息到session session.setAttribute("providerInfo_gys",customer2); return "redirect:" + goURL; } } else { return "redirect:" + goURL; } } } } /** * 用户上岸 * @param request * @param response * @param cus * @return */ @RequestMapping("/UserLogin") @ResponseBody public Map<String, Object> goLogin(HttpServletRequest request,HttpServletResponse response,@ModelAttribute("ProviderInfo") ProviderInfo cus) { /*省略一些逻辑推断*/ cus.setPwd(MD5Util.MD5(Pwd)); ProviderInfo providerInfo = infoService.login(cus); Map<String, Cookie> cookieMap = new HashMap<String, Cookie>(); if (providerInfo == null) { // 上岸失利,从新跳转到上岸页面 map.put("error", "暗码毛病"); return map; }else{ String newUserName = null; if (remember_me.equals("1")) {// 有挑选一个月免登录 try { newUserName = URLEncoder.encode(username, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } Cookie nameCookie = new Cookie("username", newUserName); String pwdMd5Cook = MD5Util.MD5(Pwd); Cookie pwdCookie = new Cookie("pwd", pwdMd5Cook);// 保留加密后的暗码+"create" nameCookie.setMaxAge(60 * 60 * 24 * 365);// 用户名保留一年 pwdCookie.setMaxAge(60 * 60 * 24 * 30);// 暗码保留30天 // 发送Cookie信息到浏览器 response.addCookie(nameCookie); response.addCookie(pwdCookie); session.setAttribute("IsAutomaticLogin",null); }else{//没有挑选,删除上次能够已挑选自动登录时的暗码 Cookie[] cookies = request.getCookies(); if (null != cookies) { for (Cookie cookie : cookies) { cookieMap.put(cookie.getName(), cookie); } } if (cookies != null) { for (int i = 0; i < cookies.length; i++) { if (cookieMap.containsKey("pwd")) { Cookie cookie = new Cookie("pwd", null); cookie.setMaxAge(0);// 删除暗码cookie response.addCookie(cookie); } } } } // 上岸胜利,保留当前user信息,保留客户信息到session map.put("ProviderInfo", providerInfo); map.put("goURL", session.getAttribute("goURL")); session.setAttribute("providerInfo_gys", providerInfo); return map; }else { map.put("error", "该供应商账号不存在"); return map; } } /** * 注销 * @return */ @RequestMapping("/logout") public String logout(HttpServletResponse response) { Map<String, Cookie> cookieMap = new HashMap<String, Cookie>(); Cookie[] cookies = request.getCookies(); if (null != cookies) { for (Cookie cookie : cookies) { cookieMap.put(cookie.getName(), cookie); } } if (cookies != null) { for (int i = 0; i < cookies.length; i++) { if (cookieMap.containsKey("pwd")) { Cookie cookie = new Cookie("pwd", null); cookie.setMaxAge(0);// 删除暗码cookie response.addCookie(cookie); } } } session.setAttribute("providerInfo_gys", null); return "/index"; } }
以上就是基于Cookie运用过滤器完成客户接见登录功用的详解的细致内容,更多请关注ki4网别的相干文章!