现在正在做一个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中比较好呢?其他还有更恰当的方法么?大家帮忙给看看,谢谢了。
这个url是要带参数的,像下面这样
https://xxx.jsp?id='aaa'&tm='bbb'
但是客户认为这样直接传明文安全性不好,所以我把参数值加密了,下面
https://xxx.jsp?id=0adf0asf&tm=9asd8ads7f
不过客户希望连参数名也加密了,也就是说问号后面全是加密文,像下面
https://xxx.jsp?9asdf8adf8asd8fa6dsf7af8a 可是如果连参数名都没有我要如何取得参数呢?这样的要求要怎样实现呢?
如果直接取整个url的话,好像是不包括参数部分的吧,好像只能取到问号前面的部分。2. 我要发的mail有一些动态的数据,不过还有一大段静态的文字,用户希望以后可以自己修改
这段文字,这样的话我考虑把这段文字定义在一个外部文件里,大家觉得是直接写在一个文本文件
直接读进来好呢?还是也写在struts的properties中比较好呢?其他还有更恰当的方法么?大家帮忙给看看,谢谢了。
但是我现在的问题并不是加密解密的问题,而是如果我连参数名都加密了,
那在后台要如何取得参数呢?
2、外部文件,和sturts的properties都差不多,我建议保存在数据库里,还能给客户做一个在web上直接修改的功能。
关注一下,我也想知道这个怎么解决。
这个倒是简单的。
然后这个页面上能够提交action?
是这么个思路?受启发了。
我和大家再详细说一下现在的状况。
就向大家都知道的一样,用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文件一类的,
让他点一下就自动执行生成编码后的文件。直接的外部文件的话不知道是不是也有编码的问题,等我试一下给
大家一个结果。至于写入数据库的话,多一个修改画面就要多出费用,那客户是万万不干的,呵呵。大家再集思广益一下,帮帮忙。
request.getParameterNames();
得到的是参数名,解密后再request.getParameter(key);再解密
如果下面这种格式的话
https://xxx.jsp?9asdf8adf8asd8fa6dsf7af8a
通过request.getParameterNames(); 的确就把加密部分全都取出来了。
实际上是被认为一个没有值部分的参数名了。
再解密正常的情况下回还原出整个参数部分,这样 id=aaa&tm=bbb。
不过,这时候要想取得参数值得话,就只能对这段纯文本的string来操作了吧,
比如第一个等号到&是第一个参数值,第二个等号到最后是第二个参数值。
但是如果用户由于错误操作什么的,把加密字符串变更了的话,哪怕只有一点,
解密后的东西也可能面目全非,这样就有可能造成根本无法确定那里是第一个参数,
哪里是第二个参数(等号什么的可能都没有了)。
再硬写一段来判断解密后的东西倒是可以,但如果错误的解密文中出现了两个id的
参数名的时候,或者其他的错误的时候,总感觉这个地方的逻辑会很混乱,所以还是想
建议用户采取上面的第二种方式,即参数名明文,值加密。
https://xxx.jsp?para1=0adf0asf¶2=9asd8ads7f不知道我想的还有没有什么问题,这些天谢谢大家的回答了,没什么的话,明天结帖。
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);
}
}
我的确是把身份验证给忘了,多亏你提醒。
结了