软键盘实例 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,发到后端,后端流程就完全不需要改变了
时间: 2024-11-05 11:49:50