软键盘实例 request参数修改
2016-07-12 16:33
591 查看
软键盘实例 request参数修改
这里的键盘 里面的内容是乱序的,每次请求都会不一样的顺序。
键盘内容是一个DIV的背景图,方框是DIV边框。控制按钮直接在前台控制就行。
请求流程如下
JSP请求软键盘图片—>action 绘制图片并记录 每个值对应的位置JSP登录(密码位置)—->Filter把密码转换成真实密码值—>登录校验Filter
代码如下
<%@ page isELIgnored="false" %> <%@ page language="java" contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="renderer" content="webkit"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-store, must-revalidate"> <meta http-equiv="expires" content="0"> <title>XXXXXXXX</title> <link rel="shortcut icon" href="r/img/icon/favicon.ico" type="image/x-icon" /> <link href="r/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <style type="text/css" media="screen, projection"> body{ background-color: #7090A8; font-family: "Microsoft YaHei", SimHei, SimSun; padding-top: 90px; } .div-signin { width: 300px; text-align: center; margin: 0 auto; } .form-signin-title { color: #fff; } .panel-default { border-radius: 4px; behavior: url(r/jquery/ie-css3.htc); } .panel-default > .panel-heading{ background-color: #fff; border-bottom: none; } .btn { background-image: none; border: medium none; border-radius: 3px; box-shadow: none; font-size: 14px; font-weight: 600; margin-bottom: 0; outline: medium none !important; padding: 8px 16px; text-shadow: none; } .input.btn { outline: medium none; } .btn-lg { padding: 16px 28px; } .btn-sm { font-size: 12px; padding: 4px 8px; } .btn-sm i { font-size: 14px; } .btn-xs { font-size: 12px; padding: 1px 5px; } .btn-primary { background: none repeat scroll 0 0 #7191a8; color: white !important; } .btn-primary:hover, .btn-primary:focus { background: none repeat scroll 0 0 #61859e; text-decoration: none; } .btn-primary:active, .btn-primary.active { background: none repeat scroll 0 0 #61859e; outline: 0 none; } .auth-company { color: #fff; } .auth-company a{ color: #fff; text-decoration: none; } .soft_key{ -moz-user-select: none; border-radius: 3px; display: block; height: 29px; opacity: 0.5; position: absolute; width: 29px; border:solid blue 1px; } #softkb_div { background-image: url("getDocumentImg.action"); display: block; height: 145px; position: absolute; width: 393px; z-index: 999; border:solid 1px rgb(6,166,213); } .soft_ckey { -moz-user-select: none; border-radius: 3px; display: block; height: 29px; opacity: 0.5; position: absolute; border:solid blue 1px; color:black; } a:hover{ text-decoration:none; } .soft_ckey:hover{ background-color:#0000ff; } .soft_key:hover{ background-color:#0000ff; } #shift { height:37px; width: 63px; } #skb_shift { z-index: 9; } </style> </head> <body> <div class="container"> <div class="div-signin"> <h2 class="form-signin-title" id="logo">xxxxxx</h2> <br/> <div class="panel panel-default"> <div class="panel-heading"> <strong> <c:if test="${param.login_error==1}"> <font color="red"> <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />.</font> </c:if> <c:if test="${param.login_error==2}"> <font color="red"><c:out value="验证码错误!" /></font> </c:if> </strong> </div> <div class="panel-body"> <form class="form-signin" id="loginForm" role="form" action="j_spring_security_check" method="POST"> <div class="form-group"> <input type="text" class="form-control" placeholder="账号" name="j_username" required autofocus maxlength="20" /> </div> <div id="passwdinput" class="form-group" style="display:block;"> <input id="securityPasswd" class="form-control" type="password" maxlength="20" name="j_password" placeholder="密码" readonly> </div> <input id="SoftKeyBoardPassword" name="SoftKeyBoardPassword" type="hidden" value=""/> <input id="isUseSKB" name="isUseSKB" type="hidden" value="1" /> <div id="softkbinput" class="form-group"> <!-- <input id="passwdDisplay" class="form-control" type="text" readonly="" required="required" maxlength="10" placeholder="密码"> <input id="passwdInput" type="hidden" name="skb_password" maxlength="20" value=""> --> <div id="softkb_div" style="display: none;" > <a id="n00" class="soft_key" style="top: 9px; left: 10px;" sftid="s00"> </a> <a id="n01" class="soft_key" style="top: 9px; left: 43px;" sftid="s01"> </a> <a id="n02" class="soft_key" style="top: 9px; left: 76px;" sftid="s02"> </a> <a id="n03" class="soft_key" style="top: 9px; left: 109px;" sftid="s03"> </a> <a id="n04" class="soft_key" style="top: 9px; left: 142px;" sftid="s04"> </a> <a id="n05" class="soft_key" style="top: 9px; left: 175px;" sftid="s05"> </a> <a id="n06" class="soft_key" style="top: 9px; left: 208px;" sftid="s06"> </a> <a id="n07" class="soft_key" style="top: 9px; left: 241px;" sftid="s07"> </a> <a id="n08" class="soft_key" style="top: 9px; left: 274px;" sftid="s08"> </a> <a id="n09" class="soft_key" style="top: 9px; left: 307px;" sftid="s09"> </a> <a id="a00" class="soft_key" style="top: 42px; left: 10px;" sftid="A00"> </a> <a id="a01" class="soft_key" style="top: 42px; left: 43px;" sftid="A01"> </a> <a id="a02" class="soft_key" style="top: 42px; left: 76px;" sftid="A02"> </a> <a id="a03" class="soft_key" style="top: 42px; left: 109px;" sftid="A03"> </a> <a id="a04" class="soft_key" style="top: 42px; left: 142px;" sftid="A04"> </a> <a id="a05" class="soft_key" style="top: 42px; left: 175px;" sftid="A05"> </a> <a id="a06" class="soft_key" style="top: 42px; left: 208px;" sftid="A06"> </a> <a id="a07" class="soft_key" style="top: 42px; left: 241px;" sftid="A07"> </a> <a id="a08" class="soft_key" style="top: 42px; left: 274px;" sftid="A08"> </a> <a id="a09" class="soft_key" style="top: 42px; left: 307px;" sftid="A09"> </a> <a id="a10" class="soft_key" style="top: 75px; left: 29px;" sftid="A10"> </a> <a id="a11" class="soft_key" style="top: 75px; left: 62px;" sftid="A11"> </a> <a id="a12" class="soft_key" style="top: 75px; left: 95px;" sftid="A12"> </a> <a id="a13" class="soft_key" style="top: 75px; left: 128px;" sftid="A13"> </a> <a id="a14" class="soft_key" style="top: 75px; left: 161px;" sftid="A14"> </a> <a id="a15" class="soft_key" style="top: 75px; left: 194px;" sftid="A15"> </a> <a id="a16" class="soft_key" style="top: 75px; left: 227px;" sftid="A16"> </a> <a id="a17" class="soft_key" style="top: 75px; left: 260px;" sftid="A17"> </a> <a id="a18" class="soft_key" style="top: 75px; left: 293px;" sftid="A18"> </a> <a id="a19" class="soft_key" style="top: 108px; left: 76px;" sftid="A19"> </a> <a id="a20" class="soft_key" style="top: 108px; left: 109px;" sftid="A20"> </a> <a id="a21" class="soft_key" style="top: 108px; left: 142px;" sftid="A21"> </a> <a id="a22" class="soft_key" style="top: 108px; left: 175px;" sftid="A22"> </a> <a id="a23" class="soft_key" style="top: 108px; left: 208px;" sftid="A23"> </a> <a id="a24" class="soft_key" style="top: 108px; left: 241px;" sftid="A24"> </a> <a id="a25" class="soft_key" style="top: 108px; left: 274px;" sftid="A25"> </a> <a id="skb_close" class="soft_ckey" style="top: 9px; left: 340px; width: 43px;">关闭</a> <a id="skb_backspace" class="soft_ckey" style="top: 42px; left: 340px; width: 43px;">退格 </a> <a id="skb_shift" class="soft_ckey" style="top: 108px; left: 10px; width: 63px;">转换</a> <a id="skb_reset" class="soft_ckey" style="top: 108px; left: 307px; width: 63px;">清空 </a> </div> </div> <div class="form-group input-group"> <input class="form-control" name="j_code" id="verifyCode" maxlength="4" type="text" placeholder="验证码"/> <span class="input-group-addon" style="padding: 0;"> <img src="Captcha.jpg" style="width: 100px; max-height: 30px;" onclick="this.src='Captcha.jpg?r='+Math.random();" > </span> </div> <hr> <div class="row"> <div class="col-md-4"> <a class="btn btn-primary" role="button" id="loginBtn" href="javascript:void(0);">登录</a> </div> <div class="col-md-8 text-left"> <input id="isRemember" type="checkbox" checked="checked" /> 记住用户名<br/> <small style="color: #555;">忘记密码请联系系统管理员</small> </div> </div> </form> </div> </div> </div> </div> <div class="text text-center auth-company">xxxxxx</div> <script type="text/javascript" src="r/plugins/jquery/jquery-1.11.0.min.js"></script> <script type="text/javascript" src="r/bootstrap-3.3.5-dist/js/bootstrap.min.js"></script> <script type="text/javascript" src="r/jquery/jquery.placeholder.min.js"></script> <script type="text/javascript" src="r/plugins/jquery/jquery-migrate-1.2.1.min.js"></script> <script type="text/javascript" src="r/plugins/jquery/ui/jquery-ui-1.10.4.custom.min.js"></script> <script type="text/javascript" src="r/plugins/jquery/jquery.cookie.js"></script> <script type="text/javascript"> if(self!=top){ top.location="login.jsp"; } var USERNAME = "USERNAME"; if ( $.cookie(USERNAME) ) { $('input[name="j_username"]').val($.cookie(USERNAME)); } var loginFormSubmit = function() { if ( $('#isRemember').attr('checked')) { $.cookie(USERNAME, $('input[name="j_username"]').val(), {expires: 7}) } else { $.removeCookie(USERNAME); } if(1 == $('#isUseSKB').val()) { //alert("1"); $('#securityPasswd').val($('#SoftKeyBoardPassword').val()); } $('#loginForm')[0].submit(); }; $('#loginForm input').bind('keydown', function(e){ if ( e.which == 13 ) { loginFormSubmit(); } }); $('#loginBtn').click(function(){ loginFormSubmit();}); /*var urls = { skb:'softkb_security', sec:'j_spring_security_check' };*/ var shift = false; var securityLogin = false; var initSoftkb = function() { $('#logo').click(function(){ securityLogin = !securityLogin; if ( securityLogin ) { alert('切换密码输入模式为键盘.'); $('#softkbinput').hide(); //$('#passwdinput').show(); //$('#passwdDisplay').removeAttr('required'); $('#isUseSKB').val(0); $('#securityPasswd').removeAttr('readonly'); $('#securityPasswd').val(""); $('#SoftKeyBoardPassword').val(""); //$('#loginForm').attr('action',""); } else { alert('切换密码输入模式为图片软键盘.'); //$('#passwdinput').hide(); $('#softkbinput').show(); $('#isUseSKB').val(1); $('#securityPasswd').attr('readonly','false'); $('#securityPasswd').val(""); $('#SoftKeyBoardPassword').val(""); //$('#passwdDisplay').attr('required','true'); //$('#loginForm').attr('action',"LoginSoftKeyBoardServlet"); } }); $('#securityPasswd').click(function(){ $('#softkb_div').show(); }); $('#skb_close').click(function(){ $('#softkb_div').hide(); }); $('#skb_reset').click(function(){ $('#securityPasswd').val('');//.change(); $('#SoftKeyBoardPassword').val(""); //alert($('#securityPasswd').val() + "|" + $('#SoftKeyBoardPassword').val()); }); $('#skb_backspace').click(function(){ var val = $('#securityPasswd').val(); var skbVal = $('#SoftKeyBoardPassword').val(); if(val.length > 1 ) { $('#securityPasswd').val(val.substr(0, val.length-1)); $('#SoftKeyBoardPassword').val(skbVal.substr(0, skbVal.length-4)); } else { $('#securityPasswd').val('');//.change(); $('#SoftKeyBoardPassword').val(""); } //alert($('#securityPasswd').val() + "|" + $('#SoftKeyBoardPassword').val()); /*if ( val.indexOf(',') >= 0 ) { $('#passwdInput').val(val.substr(0, val.lastIndexOf(','))).change(); }*/ }); $('.soft_key').click(function(){ var val = shift?$(this).attr('sftId'):$(this).attr('id'); var secOrVal = $('#securityPasswd').val(); var hidOrVal = $('#SoftKeyBoardPassword').val(); //$('#passwdInput').val($('#passwdInput').val() + ',' + val ).change(); if(secOrVal != null && secOrVal != "") { $('#securityPasswd').val(secOrVal + '*'); $('#SoftKeyBoardPassword').val(hidOrVal + ',' + val); } else { $('#securityPasswd').val('*'); $('#SoftKeyBoardPassword').val(val); } //alert($('#securityPasswd').val() + "|" + $('#SoftKeyBoardPassword').val()); }); /*$('#passwdInput').change(function() { var val = $(this).val(); $('#passwdDisplay').val(''); if ( val ) { var arr = val.split(','); var dispVal = ''; $.each(arr, function(_i,_n){ if ( _n.length > 0 ) { dispVal += '*'; } }); $('#passwdDisplay').val(dispVal); } });*/ $('#skb_shift').click(function(){ shift = !shift; if ( shift ) { $('#softkb_div').css({'backgroundPosition':'0 -145px'});//右下正 左上负 } else { $('#softkb_div').css({'backgroundPosition':'0 0'}); } }); $('#passwdInput').val('').change(); }; $(function(){ initSoftkb(); $('input[name="j_username"]').placeholder(); $('input[name="j_password"]').placeholder(); $('input[name="j_code"]').placeholder(); }); </script> </body> </html>
键盘绘制代码如下:
package com.jiuyv.yl.console.image.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.jiuyv.common.web.action.DefaultPageSupportAction; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class JcOffDocumentAction extends DefaultPageSupportAction { // private ByteArrayInputStream inputStream; // public static Map NUMMAP = new HashMap(); // public static Map CHARMAP = new HashMap(); // public static Map<String, Character> ALPMAP = new HashMap<String, Character>(); // public ByteArrayInputStream getInputStream() { // return inputStream; // } // // // public void setInputStream(ByteArrayInputStream inputStream) { // this.inputStream = inputStream; // } private Map softKeyBoardMap = null; public String getDocumentImg() throws Exception { HttpServletResponse response = null; ServletOutputStream out = null; BufferedImage image = this.draw(); try { response = ServletActionContext.getResponse(); response.setContentType("multipart/form-data"); out = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (Exception e) { e.printStackTrace(); } } } return null; } public BufferedImage draw(){ HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); softKeyBoardMap = new HashMap(); session.setAttribute("softKeyBoardMap", softKeyBoardMap); /** * BufferedImage(int width, int height, int imageType) * 构造一个类型为预定义图像类型之一的 BufferedImage。 */ BufferedImage bufferedImage = new BufferedImage(393, 290, BufferedImage.TYPE_3BYTE_BGR); /** * createGraphics() 创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中。 */ Graphics2D graphics2d = bufferedImage.createGraphics(); Graphics2D graphicsChar = bufferedImage.createGraphics(); /** * setBackground(Color color) 设置 Graphics2D 上下文的背景色。 */ graphics2d.setBackground(Color.WHITE); /** * public abstract void clearRect(int x,int y,int width,int height) * 通过使用当前绘图表面的背景色进行填充来清除指定的矩形。此操作不使用当前绘图模式。 * 从 Java 1.1 开始,离屏图像的背景色可能与系统相关。 * 应用程序应该使用 setColor,然后使用 fillRect,以确保离屏图像被清除为指定颜色。 * 参数: * x - 要清除矩形的 x 坐标。 * y - 要清除矩形的 y 坐标。 * width - 要清除矩形的宽度。 * height - 要清除矩形的高度。 * */ graphics2d.clearRect(0, 0, 500, 300); /** * public abstract void setColor(Color c) * 将此图形上下文的当前颜色设置为指定颜色。 * 使用此图形上下文的所有后续图形操作均使用这个指定的颜色。 * 参数: * c - 新的呈现颜色。 * */ //graphics2d.setColor(Color.RED); Font font = new Font("Romantic", Font.PLAIN, 15); Font charFont = new Font("Romantic", Font.PLAIN, 8); /** * 将此图形上下文的字体设置为指定字体。 * 使用此图形上下文的所有后续文本操作均使用此字体。忽略 null 参数 */ graphics2d.setFont(font); graphicsChar.setFont(charFont); /** * public abstract void fillRect(int x,int y,int width,int height) * 填充指定的矩形。该矩形左边缘和右边缘分别位于 x 和 x + width - 1。 * 上边缘和下边缘分别位于 y 和 y + height - 1。 * 得到的矩形覆盖 width 像素宽乘以 height 像素高的区域。 * 使用图形上下文的当前颜色填充该矩形。 * */ int flag = 33; //graphics2d.fillRect(0, 0, 500, 30); graphics2d.setColor(Color.black); graphicsChar.setColor(Color.black); // x = 28; // for(int i=0; i<10; i++) { // graphics2d.drawString(String.valueOf(i), x, 33); // x += 33; // } String[] number = {"1","2","3","4","5","6","7","8","9","0"}; String[] charVal = {"!","@","#","$","%","^","&","*","(",")"}; List<String> numList = new ArrayList<String>(Arrays.asList(number)); List<String> charList = new ArrayList<String>(Arrays.asList(charVal)); Random random = new Random(); int x = 18; int y = 33; int upy = y + 143; for(int i=number.length; i>0; i--) { int position = random.nextInt(i); String num = numList.remove(position); String chr = charList.remove(position); softKeyBoardMap.put("n" + String.format("%02d", Long.valueOf(10 - i)), num);//key位置 value 值 softKeyBoardMap.put("s" + String.format("%02d", Long.valueOf(10 - i)), chr);//key位置 value 值 graphics2d.drawString(num, x, y); graphicsChar.drawString(chr, x+10, y-13); graphics2d.drawString(chr, x, upy); graphicsChar.drawString(num, x+10, upy-13); x += 33; } int alp = 97;//a int alpX = 18; int alpY = 62; for(int i=26; i>0; i--) { int alpNum = random.nextInt(i) + alp; char alpChar = (char)this.existAutoAdd(alpNum); softKeyBoardMap.put("a" + String.format("%02d", Long.valueOf(26-i)), alpChar);//key位置 value 值 softKeyBoardMap.put("A" + String.format("%02d", Long.valueOf(26-i)), String.valueOf((char)(alpChar-32)));//key位置 value 值 graphics2d.drawString(String.valueOf(alpChar), alpX, alpY); graphics2d.drawString(String.valueOf((char)(alpChar-32)), alpX, alpY + 143); alpX += 33; if(i==17) { alpX = 40; alpY = 96; } else if(i == 8) { alpX = 83; alpY = 127; } } // graphics2d.setFont(font); // graphics2d.drawString("!", x, y); // graphics2d.drawString("@", x+=33, y); // graphics2d.drawString("#", x+=33, y); // graphics2d.drawString("$", x+=33, y); // graphics2d.drawString("%", x+=33, y); // graphics2d.drawString("^", x+=33, y); // graphics2d.drawString("&", x+=33, y); // graphics2d.drawString("*", x+=33, y); // graphics2d.drawString("(", x+=33, y); // graphics2d.drawString(")", x+=33, y); /** * public abstract void fillOval(int x,int y,int width,int height) * 使用当前颜色填充外接指定矩形框的椭圆。 * 参数: * x - 要填充椭圆的左上角的 x 坐标。 * y - 要填充椭圆的左上角的 y 坐标。 * width - 要填充椭圆的宽度。 * height - 要填充椭圆的高度。 * */ // graphics2d.fillOval(20, 40, 20, 20); // graphics2d.setColor(Color.ORANGE); // graphics2d.fillOval(40, 60, 20, 20); // graphics2d.setColor(Color.YELLOW); // graphics2d.fillOval(60, 80, 20, 20); // graphics2d.setColor(Color.GREEN); // graphics2d.fillOval(80, 100, 20, 20); // graphics2d.setColor(Color.CYAN); // graphics2d.fillOval(100, 120, 20, 20); // graphics2d.setColor(Color.BLUE); // graphics2d.fillOval(120, 140, 20, 20); // graphics2d.setColor(Color.MAGENTA); // graphics2d.fillOval(140, 160, 20, 20); // // graphics2d.setColor(Color.MAGENTA); // graphics2d.fillOval(340, 160, 20, 20); // graphics2d.setColor(Color.BLUE); // graphics2d.fillOval(360, 140, 20, 20); // graphics2d.setColor(Color.CYAN); // graphics2d.fillOval(380, 120, 20, 20); // graphics2d.setColor(Color.GREEN); // graphics2d.fillOval(400, 100, 20, 20); // graphics2d.setColor(Color.YELLOW); // graphics2d.fillOval(420, 80, 20, 20); // graphics2d.setColor(Color.ORANGE); // graphics2d.fillOval(440, 60, 20, 20); // graphics2d.setColor(Color.RED); // graphics2d.fillOval(460, 40, 20, 20); /** * public abstract void drawLine(int x1,int y1,int x2,int y2) * 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 * 参数: * x1 - 第一个点的 x 坐标。 * y1 - 第一个点的 y 坐标。 * x2 - 第二个点的 x 坐标。 * y2 - 第二个点的 y 坐标。 * */ // graphics2d.setColor(Color.RED); // for(int m=0;m<5;m++){ // graphics2d.drawLine(0, 190+m*20, 500, 190+m*20); // } // graphics2d.setColor(Color.RED); // for(int n=0;n<25;n++){ // graphics2d.drawLine(0+n*20, 190, 0+n*20, 270); // } /** * public abstract void dispose()释放此图形的上下文以及它使用的所有系统资源。 * 调用 dispose 之后,就不能再使用 Graphics 对象。 * Java 程序运行时,可以在一个短时间帧内创建大量的 Graphics 对象。 * 尽管垃圾回收器的终止进程也能够进行相同的系统资源释放, * 但是最好通过调用此方法来手工释放相关资源,而不是依靠终止进程, * 因为终止进程需要很长时间才能结束运行。 * 作为组件 paint 和 update 方法的参数提供的 Graphics 对象, * 在这些方法返回时将被系统自动释放。 * 为了提高效率,仅当所使用的 Graphics 对象 * 是由组件或另一个 Graphics 对象直接创建时, * 程序员才应在使用完此 Graphics 后调用 dispose。 * */ graphics2d.dispose(); /** * public void flush() * 刷新此 Image 对象正在使用的所有可重构的资源。 * 这包括为呈现到屏幕而缓存的所有像素数据, * 以及用来存储图像数据或像素的所有系统资源(如果可以重新创建它们)。 * 图像被重置为与初始创建时类似的状态,因此如果再次呈现图像, * 则必须重新创建图像数据或再次从源中获取这些数据。 * 此方法如何影响特定类型的 Image 对象的示例如下: * BufferedImage 对象不改动存储其像素的主要 Raster,但是刷新有关像素的缓存信息, * 比如上传到用于加速位图的显示硬件的副本。 * Image 对象由带有 width 和 height 参数的 Component 方法创建, * 该方法不改动像素的主要缓冲区,但是释放所有缓存的信息, * 这与对 BufferedImage 对象的操作非常类似。 * VolatileImage 对象释放其所有像素资源, * 这些资源包括通常存储在缺乏资源的显示硬件上的主要副本。 * 这些对象稍后可以使用其 validate 方法还原。 * 卸载从文件、URL 中加载或由 ImageProducer 生成的 Toolkit * 和 Component 类创建的 Image 对象,并释放所有本地资源。 * 稍后可在呈现这些对象时根据需要从初始源重新加载它们,就像第一次创建它们时那样。 * */ bufferedImage.flush(); return bufferedImage; } public int existAutoAdd(int value) { if(!softKeyBoardMap.containsValue((char)(value))) { return value; } else { return existAutoAdd(++value); } } public static String getDecoderPassword(String password,HttpServletRequest request) { // String password = request.getParameter("j_password"); String regex = ","; String changePassword = ""; if (null != password && password.length() > 0) { // JcOffDocumentAction String[] pw = password.split(regex); Map skbMap = (Map)request.getSession().getAttribute("softKeyBoardMap"); if (null != pw || pw.length > 0) { for (int i = 0; i < pw.length; i++) { String pwStr = pw[i]; changePassword += skbMap.get(pwStr); } } } return changePassword; } }
struts2 配置如下
<!-- 软键盘 --> <action name="getDocumentImg" class="JcOffDocumentAction" method="getDocumentImg"> </action>
这里软键盘主做好了。在页面上可以看到键盘样式。
在点击登录的时候,前台密码输入框j_password装的不是用户输入的数据,而是位置代码。传到后台后需要解析成原密码。而解析上面代码放到了SESSION中。
以下代码是登录处理代码。
package com.jiuyv.yl.console.security.util; import java.io.IOException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import com.jiuyv.yl.console.image.action.JcOffDocumentAction; public class ParamFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Map<String, String[]> m = new HashMap<String, String[]>( request.getParameterMap()); String[] pwdArray = m.get("j_password"); String[] isUseSKB = m.get("isUseSKB"); if (null !=isUseSKB && isUseSKB.length>0 && "1".equals(isUseSKB[0])) { ParameterRequestWrapper wrapRequest = new ParameterRequestWrapper( (HttpServletRequest) request, m); if (null != pwdArray) { String pwdStr = JcOffDocumentAction.getDecoderPassword(pwdArray[0], wrapRequest); String[] pwd = { pwdStr }; m.put("j_password", pwd); } chain.doFilter(wrapRequest, response); } else { chain.doFilter(request, response); } } @Override public void destroy() { // TODO Auto-generated method stub } }
这块代码是一个Filter,拦截登录请求,因为我后台登录校验用的是springScurity。所以不能在那块处理。而用Filter截下来的请求,request参数是不能修改的(代码被LOCK,一改就报错)。所以我这里自己建一个request ParameterRequestWrapper 。
代码如下:
package com.jiuyv.yl.console.security.util; import java.util.Enumeration; import java.util.Map; import java.util.Vector; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class ParameterRequestWrapper extends HttpServletRequestWrapper { private Map<String, String[]> params; public ParameterRequestWrapper(HttpServletRequest request, Map<String, String[]> newParams) { super(request); this.params = newParams; // RequestDispatcher.forward parameter renewParameterMap(request); } @Override public String getParameter(String name) { String result = ""; Object v = params.get(name); if (v == null) { result = null; } else if (v instanceof String[]) { String[] strArr = (String[]) v; if (strArr.length > 0) { result = strArr[0]; } else { result = null; } } else if (v instanceof String) { result = (String) v; } else { result = v.toString(); } return result; } @Override public Map<String, String[]> getParameterMap() { return params; } @Override public Enumeration<String> getParameterNames() { return new Vector<String>(params.keySet()).elements(); } @Override public String[] getParameterValues(String name) { String[] result = null; Object v = params.get(name); if (v == null) { result = null; } else if (v instanceof String[]) { result = (String[]) v; } else if (v instanceof String) { result = new String[] { (String) v }; } else { result = new String[] { v.toString() }; } return result; } private void renewParameterMap(HttpServletRequest req) { String queryString = req.getQueryString(); if (queryString != null && queryString.trim().length() > 0) { String[] params = queryString.split("&"); for (int i = 0; i < params.length; i++) { int splitIndex = params[i].indexOf("="); if (splitIndex == -1) { continue; } String key = params[i].substring(0, splitIndex); if (!this.params.containsKey(key)) { if (splitIndex < params[i].length()) { String value = params[i].substring(splitIndex + 1); this.params.put(key, new String[] { value }); } } } } } }
web.xml 配置如下:
<filter> <filter-name>ParameterFilter</filter-name> <filter-class>com.jiuyv.yl.console.security.util.ParamFilter</filter-class> </filter> <filter-mapping> <filter-name>ParameterFilter</filter-name> <url-pattern>/j_spring_security_check</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
这个Filter把request把密码转换成原码后,新建了自己的request,发到后端,后端流程就完全不需要改变了。
相关文章推荐
- datebox清除按钮,datebox加上清除按钮,easyui datebox加上清除按钮
- android -- 蓝牙 bluetooth (五)接电话与听音乐
- RichFaces Developer Guide 3.3.3(6-6)
- 347. Top K Frequent Elements
- android -- 蓝牙 bluetooth (四)OPP文件传输
- android -- 蓝牙 bluetooth (三)搜索蓝牙
- UE4使用widget创建UI界面播放视频
- u3d第一发使用ugui完成消灭星星游戏(一)
- UE4使用widget创建UI界面播放视频
- 【UESTC 482】Charitable Exchange(优先队列+bfs)
- iOS UITextView相关
- bigbluebutton视频直播服务器调用接口
- SAP OBYC自动记账的实例说明 +VALUE STRING
- requestLayout, invalidate 和 postInvalidate 的异同
- android -- 蓝牙 bluetooth (二) 打开蓝牙
- web项目开发上传功能
- JUC源码分析21-队列-LinkedBlockingDeque
- iOS如果给UITapGestureRecognizer添加tap值
- hdu 3530 Subsequence 单调队列
- NDK 编译报错:request for member 'FindClass' in something not a structure or union