软键盘实例 request参数修改

软键盘实例 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" />&emsp;记住用户名<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

软键盘实例 request参数修改的相关文章

第一个app-进阶:1、让EditText屏蔽软键盘仍能光标闪动:2、EditText 的inputType参数类型(密码方式-隐藏显示、只允许输入数字等等)

EditText屏蔽软键盘后,光标消失问题 开始我有个需求:屏蔽系统软键盘 于是找到并使用这个方法: //edit_text1.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text2.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出//edit_text3.setInputType(InputType.TYPE_NULL); //屏蔽软键盘弹出 让三个EditText都成功地没有软键盘弹出. 后来我

Android——软键盘操作+fragment之间传递参数

原文地址: Android 手动显示和隐藏软键盘 Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果) Android Fragment传递参数_Fragment之间传值的两种方法

【转载】android软键盘的一些控制

原文地址:http://blog.csdn.net/wang_shaner/article/details/8467688 "EditText + Button"  形成一个 "输入+按键响应" 的案例在android编程中是最常见不过的了. 但还有一些细节需要注意: 在EditText输入后,点击Button进行请求,软键盘应该自行消失 在EditText输入后,不点击Button进行请求,而是直接点击软键盘上的"回车",那么也应该能够正常响应

android软键盘的一些控制 转来的,格式有点乱

"EditText + Button"  形成一个 "输入+按键响应" 的案例在android编程中是最常见不过的了. 但还有一些细节需要注意: 在EditText输入后,点击Button进行请求,软键盘应该自行消失 在EditText输入后,不点击Button进行请求,而是直接点击软键盘上的"回车",那么也应该能够正常响应请求 针对问题1,可以在响应Button的onClick事件中,主动将软键盘隐藏,加入如下代码即可 [java] view

Cocos2d-X中使用CCTextFieldTTF的简单应用显示文本和弹出软键盘

 学了几天Cocos2d-X后今天终于可以试试Cocos2d-X的跨平台开发了,由于条件的限制,我只会测试Cocos2d-X在Android平台上的开发,今天就以一个简单的文本测试Android上的效果,需要用到CCTextFieldTTF类,CCTextFieldTTF是一个显示文本控件的类用于输入文本和现实文本类似于Windows编程中的Static控件和Edit控件 程序实例:使用TextFieldTTF类创建一个文本,触摸文本弹出软键盘 首先创建一个TextFieldTTF.h的头文

[转]android自动弹出软键盘(输入键盘)

转自:http://www.devdiv.com/home.php?mod=space&uid=65729&do=blog&id=11847 很多应用中对于一个界面比如进入搜索界面或者修改信息等等情况,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出(因为用户进入该界面必然是为了更改信息).具体实现这种效果如下: [代码]java代码: 1 EditText editText.setFocusable(true); 2 editText.setFocusableInT

彻底搞定Android开发中软键盘的常见问题

软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog. InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示. 软键盘显示的调整 Android定义了一个属性,名字为windowSoftInputMode, 这个属性用于设置Activity主

关于聊天面板那点事~~~软键盘和表情框切换闪跳问题!

啥也不多说,先上图 先说实现的功能:emoji表情和图片表情的显示(未实现gif表情的显示).软键盘高度的获取.软键盘和表情面板的完美切换(不会抖动).微信公众号键盘的展示. 该dome主要针对做im通讯的童鞋对表情实现的各种纠结给点启发...demo中用到了:钉钉.微信.网易中的表情图片.在这里谢谢了!如有不足或侵犯到您的权限请及时告知.谢谢! 面板布局: <?xml version="1.0" encoding="utf-8"?> <Linea

Android 软键盘控制弹出(很好使,自己写的,绝对能用)

最近在做电商类的项目,由于需求的不断变动,在有关输如文本框的地方,要求弹出软键盘,如果界面很多的下,则需要些很多代码,在空闲的时候,写了一个软键盘管理类,很好使,自己写的,亲自试过,这是一个软键盘控制单例模式实现的. 代码如下: package com.okdi.ilife.activity.login; import android.app.Activity; import android.content.Context; import android.view.View; import an