现在正在做一个java mail的东西,有下面几个问题。1. 在我的java端生成的mail里面有一个url,用户会通过这个url转到别的页面。
   这个url是要带参数的,像下面这样
     https://xxx.jsp?id='aaa'&tm='bbb'
   但是客户认为这样直接传明文安全性不好,所以我把参数值加密了,下面
     https://xxx.jsp?id=0adf0asf&tm=9asd8ads7f
   不过客户希望连参数名也加密了,也就是说问号后面全是加密文,像下面
     https://xxx.jsp?9asdf8adf8asd8fa6dsf7af8a   可是如果连参数名都没有我要如何取得参数呢?这样的要求要怎样实现呢?
   如果直接取整个url的话,好像是不包括参数部分的吧,好像只能取到问号前面的部分。2. 我要发的mail有一些动态的数据,不过还有一大段静态的文字,用户希望以后可以自己修改  
   这段文字,这样的话我考虑把这段文字定义在一个外部文件里,大家觉得是直接写在一个文本文件
   直接读进来好呢?还是也写在struts的properties中比较好呢?其他还有更恰当的方法么?大家帮忙给看看,谢谢了。

解决方案 »

  1.   

    1,可以使用BASE64编码,然后在服务器段BASE64解码,还原出URL。 也可以研究一下linkedin,twitter的链接技术。 他们也将一个长链接code成一个短链接,而且是以他们网站打头的。
      

  2.   

    感谢accessmanager88的回答。
    但是我现在的问题并不是加密解密的问题,而是如果我连参数名都加密了,
    那在后台要如何取得参数呢?
      

  3.   

    非得一定要带参数吗。?id=0adf0asf&tm=9asd8ads7f?你可以直接用hidden隐藏变量。然后request.getSession().getAttribute("id")获取可以吗
      

  4.   

    1、可以用post提交,url上就看不到了
    2、外部文件,和sturts的properties都差不多,我建议保存在数据库里,还能给客户做一个在web上直接修改的功能。
      

  5.   

    人家都说了是发mail到用户那,你怎么用hidden呀?
    关注一下,我也想知道这个怎么解决。
      

  6.   

    难道做成一个html,作为附件发送给用户,邮件内容就是html内容。
    这个倒是简单的。
    然后这个页面上能够提交action?
    是这么个思路?受启发了。
      

  7.   

    比如说 id='aaa'&tm='bbb'  使用BASE64编码一下,变成了aWQ9J2FhYScmdG09J2JiYic=(我瞎写的,反正就是一个字符串)。那么Url不就是: http://xxx.jsp?aWQ9J2FhYScmdG09J2JiYic=了吗?然后在服务器端decode一下,就变成了: http://xxx.jsp?id='aaa'&tm='bbb' 
      

  8.   

    感谢大家的回答。
    我和大家再详细说一下现在的状况。
    就向大家都知道的一样,用javamail的时候可以有纯文本和html两种格式。
    html格式的时候,大家所说的js提交,post提交可能是可以实现我现在的需求的,
    但是考虑到有的客户端的mail工具可能是不支持html收信的,这样直接发html格式mail
    的时候,客户那里可能显示出来的就是一堆html代码,这样不太好,所以客户还是要求以
    纯文本的格式发信,这样的话,如果客户端的mail工具可以自动识别url的话,直接点就可以
    弹出下一个画面了,如果无法识别的话,就需要把这段url拷出来,粘贴到IE中来跳转,这时
    大家所说的隐藏字段,js提交,post提交都是无法实现的。accessmanager88感谢再次回答。
    因为我到下一画面之前,是要检查一下传过来的参数的,所以会直接进入action.
    但是在java端要怎样获得这一段完整的url呢,是用哪一个函数呢?我只记得.net的确是有
    一个方法,但那也只是获得问号以前的部分,参数部分是得不到的,java里面我还不太清楚,
    可以再稍微详细告诉我一下么,我比较菜,麻烦你了。yangxiao_jiang 谢谢。
    既然外部文件和properties文件都差不多的话,我还是比较倾向于直接用外部文件的,因为properties
    文件变了之后还要执行native那个命令去编码,这对用户可能有些难度,除非我再写一个batch文件一类的,
    让他点一下就自动执行生成编码后的文件。直接的外部文件的话不知道是不是也有编码的问题,等我试一下给
    大家一个结果。至于写入数据库的话,多一个修改画面就要多出费用,那客户是万万不干的,呵呵。大家再集思广益一下,帮帮忙。
      

  9.   


    request.getParameterNames();
    得到的是参数名,解密后再request.getParameter(key);再解密
      

  10.   

    lijing0511 感谢回答。
    如果下面这种格式的话
    https://xxx.jsp?9asdf8adf8asd8fa6dsf7af8a
    通过request.getParameterNames(); 的确就把加密部分全都取出来了。
    实际上是被认为一个没有值部分的参数名了。
    再解密正常的情况下回还原出整个参数部分,这样 id=aaa&tm=bbb。
    不过,这时候要想取得参数值得话,就只能对这段纯文本的string来操作了吧,
    比如第一个等号到&是第一个参数值,第二个等号到最后是第二个参数值。
    但是如果用户由于错误操作什么的,把加密字符串变更了的话,哪怕只有一点,
    解密后的东西也可能面目全非,这样就有可能造成根本无法确定那里是第一个参数,
    哪里是第二个参数(等号什么的可能都没有了)。
    再硬写一段来判断解密后的东西倒是可以,但如果错误的解密文中出现了两个id的
    参数名的时候,或者其他的错误的时候,总感觉这个地方的逻辑会很混乱,所以还是想
    建议用户采取上面的第二种方式,即参数名明文,值加密。
    https://xxx.jsp?para1=0adf0asf&para2=9asd8ads7f不知道我想的还有没有什么问题,这些天谢谢大家的回答了,没什么的话,明天结帖。
      

  11.   

    package com.east.email;import java.util.Date;
    import java.util.Properties;import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.activation.*;public class SendMail {
     private static MailAuthenticator autherticator=null;
     public static void main(String[] args) {
      for (int i=0;i<5;i++){
     
    String from="[email protected]";
    String to="[email protected]";
    String smtpServer="smtp.163.com";
    String subject="Hello ,this is a email Test!!";
    String content ="Welcome to you!!";
    Properties props = System.getProperties();

    props.put("mail.smtp.host", smtpServer);
    props.put("mail.smtp.auth","true");
    autherticator = new MailAuthenticator("[email protected]","aaaa");
        Session session = Session.getDefaultInstance(props,autherticator);
        MimeMessage msg = new MimeMessage(session);
        try{
           msg.setFrom(new InternetAddress(from));
           msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to));
           msg.setSubject(subject);
           msg.setSentDate(new Date());
           msg.setText(content);
           Transport.send(msg);
           System.out.println("成功发送邮件......");
        }catch(Exception se){
         se.printStackTrace();
        }
        }
    }
    }
    //现在的大部分的邮件服务器都要求有身份验证,所以需要此类实现验证功能
    class MailAuthenticator extends Authenticator{

        private String username = null;
        private String userpasswd = null;

        public MailAuthenticator(){}
        public MailAuthenticator(String username,String userpasswd){
            this.username = username;
            this.userpasswd = userpasswd;
        }
        
        public void setUserName(String username){
            this.username = username;
        }

        public void setPassword(String password){
            this.userpasswd = password;
        }

        public PasswordAuthentication getPasswordAuthentication(){
            return new PasswordAuthentication(username,userpasswd);
        }
    }

      

  12.   

    East271536394 非常感谢。
    我的确是把身份验证给忘了,多亏你提醒。
    结了